home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Info-Mac 4
/
Info_Mac IV CD-ROM (Pacific HiTech Inc.)(August 1994).iso
/
Development
/
Source
/
Telnet 2.6.1d1 4⁄26⁄94 Folder
/
source
/
main
/
event.c
< prev
next >
Wrap
Text File
|
1994-03-25
|
31KB
|
1,038 lines
/*
* event.c
*****************************************************************
* NCSA Telnet for the Macintosh *
* *
* National Center for Supercomputing Applications *
* Software Development Group *
* 152 Computing Applications Building *
* 605 E. Springfield Ave. *
* Champaign, IL 61820 *
* *
* Copyright (c) 1986-1993, *
* Board of Trustees of the University of Illinois *
*****************************************************************
*
* Main Event loop code for NCSA Telnet for the Macintosh
*
* Called by:
* maclook.c
*
* Revisions:
* 7/92 Telnet2.6: added 2 support for 2 global structs, put cursors into
* an array, cleaned up defines Scott Bulmahn
*
*/
#ifdef MPW
#pragma segment 4
#endif
/*
* Files for inclusion.
*/
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <EPPC.h>
#include <AppleEvents.h>
#include "TelnetHeader.h"
#include "VSkeys.h"
#include "wind.h"
#include "network.proto.h"
#include "mydnr.proto.h"
#include "bkgr.proto.h"
#include "maclook.proto.h"
#include "InternalEvents.h"
#include "vsdata.h"
#include "vsinterf.proto.h"
#include "menuseg.proto.h"
#include "vrrgmac.proto.h"
#include "tekrgmac.proto.h"
#include "rsmac.proto.h"
#include "event.proto.h"
#include "macros.proto.h" /* For setmacro proto */
#include "netevent.proto.h"
#include "translate.proto.h"
#include "parse.proto.h"
#include "ftpbin.proto.h"
#include "debug.h"
#include "Connections.proto.h"
extern short scrn;
extern MenuHandle myMenus[NMENUS];
extern Boolean gKeyboardHasControlKey;
extern SysEnvRec theWorld; /* BYU 2.4.12 - System Environment record */
extern WindRec *screens,
*ftplog;
extern Cursor *theCursors[];
/*
* Declarations for constant variables
*/
unsigned char kpxlate[2][62] =
/* table for translating virtual scan codes to internal codes for
special keys. */
{
{ /* virtual key code */
VSKP, /* $41 */
VSRT, /* $42 (Mac+) */
VSF4, /* $43 (ADB) */
0, /* $44 */
VSKC, /* $45 (ADB std) */
VSLT, /* $46 (Mac+) */
VSF1, /* $47 */
VSDN, /* $48 (Mac+) */
0, /* $49 */
0, /* $4A */
VSF3, /* $4B (ADB) */
VSKE, /* $4C */
VSUP, /* $4D (Mac+) */
VSKM, /* $4E */
0, /* $4F */
0, /* $50 */
VSF2, /* $51 (ADB) */
VSK0, /* $52 */
VSK1, /* $53 */
VSK2, /* $54 */
VSK3, /* $55 */
VSK4, /* $56 */
VSK5, /* $57 */
VSK6, /* $58 */
VSK7, /* $59 */
0, /* $5A */
VSK8, /* $5B */
VSK9, /* $5C */
0, /* $5D */
0, /* $5E */
0, /* $5F */
VSF10, /* $60 */ /* BYU 2.4.12 */
VSF11, /* $61 */ /* BYU 2.4.12 */
VSF12, /* $62 */ /* BYU 2.4.12 */
VSF8, /* $63 */ /* BYU 2.4.12 - was VSF3 */
VSF13, /* $64 */ /* BYU 2.4.12 */
VSF14, /* $65 */ /* BYU 2.4.12 */
0, /* $66 */
VSF16, /* $67 */ /* BYU 2.4.12 */
0, /* $68 */
VSF18, /* $69 */ /* BYU 2.4.12 */
0, /* $6A */
VSF19, /* $6B */ /* BYU 2.4.12 */
0, /* $6C */
VSF15, /* $6D */ /* BYU 2.4.12 */
0, /* $6E */
VSF17, /* $6F */ /* BYU 2.4.12 */
0, /* $70 */
VSF20, /* $71 */ /* BYU 2.4.12 */
VSHELP, /* $72 */ /* BYU 2.4.12 */
VSHOME, /* $73 */ /* BYU 2.4.12 */
VSPGUP, /* $74 */ /* BYU 2.4.12 */
VSDEL, /* $75 (ADB ext) */ /* BYU 2.4.12 - was 0x7f */
VSF9, /* $76 */ /* BYU 2.4.12 - was VSF4 */
VSEND, /* $77 */ /* BYU 2.4.12 */
VSF7, /* $78 */ /* BYU 2.4.12 - was VSF2 */
VSPGDN, /* $79 */ /* BYU 2.4.12 */
VSF6, /* $7A */ /* BYU 2.4.12 - was VSF1 */
VSLT, /* $7B */
VSRT, /* $7C */
VSDN, /* $7D */
VSUP /* $7E */
},
{
VSKP, /* $41 */
VSF4, /* $42 (Mac+) */
VSF4, /* $43 (ADB) */
0, /* $44 */
VSKC, /* $45 (ADB) */
VSKC, /* $46 (Mac+) */
VSF1, /* $47 */
VSF2, /* $48 */
0, /* $49 */
0, /* $4A */
VSF3, /* $4B */
VSKE, /* $4C */
VSF3, /* $4D */
VSKM, /* $4E */
0, /* $4F */
0, /* $50 */
VSF2, /* $51 */
VSK0, /* $52 */
VSK1, /* $53 */
VSK2, /* $54 */
VSK3, /* $55 */
VSK4, /* $56 */
VSK5, /* $57 */
VSK6, /* $58 */
VSK7, /* $59 */
0, /* $5A */
VSK8, /* $5B */
VSK9, /* $5C */
0, /* $5D */
0, /* $5E */
0, /* $5F */
VSF10, /* $60 */ /* BYU 2.4.12 */
VSF11, /* $61 */ /* BYU 2.4.12 */
VSF12, /* $62 */ /* BYU 2.4.12 */
VSF8, /* $63 */ /* BYU 2.4.12 - was VSF3 */
VSF13, /* $64 */ /* BYU 2.4.12 */
VSF14, /* $65 */ /* BYU 2.4.12 */
0, /* $66 */
VSF16, /* $67 */ /* BYU 2.4.12 */
0, /* $68 */
VSF18, /* $69 */ /* BYU 2.4.12 */
0, /* $6A */
VSF19, /* $6B */ /* BYU 2.4.12 */
0, /* $6C */
VSF15, /* $6D */ /* BYU 2.4.12 */
0, /* $6E */
VSF17, /* $6F */ /* BYU 2.4.12 */
0, /* $70 */
VSF20, /* $71 */ /* BYU 2.4.12 */
VSHELP, /* $72 */ /* BYU 2.4.12 */
VSHOME, /* $73 */ /* BYU 2.4.12 */
VSPGUP, /* $74 */ /* BYU 2.4.12 */
VSDEL, /* $75 (ADB ext) */ /* BYU 2.4.12 - was 0x7f */
VSF9, /* $76 */ /* BYU 2.4.12 - was VSF4 */
VSEND, /* $77 */ /* BYU 2.4.12 */
VSF7, /* $78 */ /* BYU 2.4.12 - was VSF2 */
VSPGDN, /* $79 */ /* BYU 2.4.12 */
VSF6, /* $7A */ /* BYU 2.4.12 - was VSF1 */
VSLT, /* $7B */
VSRT, /* $7C */
VSDN, /* $7D */
VSUP /* $7E */
}
};
/* ASCII character set defines */
#define DELchar 0x7f /* BYU LSC - (DEL is defined in MacLook.h) the delete character */
#define KILLCHAR 0x15 /* the character to kill the local line with */
#include "event.proto.h"
short updateCursor(short force)
{
static Point lastPoint;
static short optwasdown;
short optDown;
Point myPoint;
unsigned char allthekeys[16]; /* Someplace to put the keymap */
if (TelInfo->myfrontwindow) { /* BYU 2.4.11 */
SetPort((GrafPtr) TelInfo->myfrontwindow); /* BYU 2.4.11 */
} else { /* BYU 2.4.11 */
SetCursor(theCursors[normcurs]); /* BYU 2.4.11 */
return(0); /* BYU 2.4.11 */
}
GetMouse(&myPoint);
GetKeys((long *) allthekeys);
optDown = allthekeys[7] &4;
if ( (!force) && EqualPt(myPoint,lastPoint) && (optDown ==optwasdown))
return(0);
if (force)
TelInfo->lastCursor=0L;
if (TelInfo->ginon) {
if (TelInfo->lastCursor!= theCursors[gincurs]) {
SetCursor(theCursors[gincurs]);
TelInfo->lastCursor = theCursors[gincurs];
}
return(1);
}
if (TelInfo->xferon && !optDown) {
if (TelInfo->lastCursor!= theCursors[xfercurs]) {
SetCursor( theCursors[xfercurs]);
TelInfo->lastCursor = theCursors[xfercurs];
}
return(1);
}
switch (TelInfo->myfronttype) {
case DEC_WINDOW:
if (RSmouseintext( TelInfo->myfrontvs, myPoint)) {
if (optDown) { /* Option key is down */
if (TelInfo->lastCursor != theCursors[poscurs]) {
TelInfo->lastCursor = theCursors[poscurs];
SetCursor(theCursors[poscurs]);
}
} else {
if (TelInfo->lastCursor != theCursors[textcurs]) {
TelInfo->lastCursor = theCursors[textcurs];
SetCursor(theCursors[textcurs]);
}
}
} else {
if (TelInfo->lastCursor != theCursors[normcurs]) {
TelInfo->lastCursor = theCursors[normcurs];
SetCursor(theCursors[normcurs]);
}
}
break;
case TEK_WINDOW:
LocalToGlobal(&myPoint);
if (PtInRgn(myPoint, TelInfo->myfrontwindow->contRgn)) { /* BYU LSC */
if (TelInfo->lastCursor != theCursors[graphcurs]) {
TelInfo->lastCursor = theCursors[graphcurs];
SetCursor(theCursors[graphcurs]);
}
} else {
if (TelInfo->lastCursor != theCursors[normcurs]) {
TelInfo->lastCursor = theCursors[normcurs];
SetCursor(theCursors[normcurs]);
}
}
break;
case NO_WINDOW:
default:
if (force) {
SetCursor( theCursors[normcurs]);
TelInfo->lastCursor= theCursors[normcurs];
}
}
lastPoint=myPoint;
optwasdown=optDown;
return(0);
}
void NoWindow( void)
{
TelInfo->myfrontwindow=0L;
TelInfo->myfronttype=NO_WINDOW;
TelInfo->myfrontRgn=0L;
updateCursor(1);
}
/* The following code was graciously donated by Marc Tamsky. When are YOU going to donate
YOUR code, eh? We know you're reading this. -- JMB */
Boolean CheckPageKeys(short code) /* NCSA: SB */
{ /* NCSA: SB */
GrafPtr currFW; // current front window holder // MAT--
short ourW; // virtual screen number holder // MAT--kinda
short x1, y2, x2, y1; // coordinates from window // MAT--pulled from scrollproc
/* NCSA: SB */
currFW = (GrafPtr)FrontWindow(); // MAT--
ourW = RSfindvwind(currFW); // MAT--
/* NCSA: SB */
switch (code) /* NCSA: SB */
{ /* NCSA: SB */
case VSPGUP: /* NCSA: SB */
VSgetrgn(ourW, &x1, &y1, &x2, &y2); // MAT--
VSscrolback(ourW, y2 - y1); /* scroll a whole windowful */ // MAT--
return TRUE; // MAT--
break; /* NCSA: SB */
/* NCSA: SB */
case VSPGDN: // MAT--121 is a PAGE DOWN.
// MAT--in rsmac.c
VSgetrgn(ourW, &x1, &y1, &x2, &y2); // MAT--
VSscrolforward(ourW, y2 - y1); /* scroll a whole windowful */ // MAT--
return TRUE; // MAT--
break; /* NCSA: SB */
// MAT--
case VSHOME: /* NCSA: SB */
VSscroltop(ourW); /* JMB 2.6 -- Created VSscroltop just for this purpose */
return TRUE; /* NCSA: SB */
break; // MAT--
// MAT--
case VSEND: /* NCSA: SB */
VSgetrgn(ourW, &x1, &y1, &x2, &y2); // MAT--
VSscrolforward(ourW, 32765); /* scroll a whole BUNCH! */ // MAT-- kludge time again. anyone suggest
return TRUE; /* NCSA: SB */
break; // MAT-- a better way to hack this part?
} // MAT--
/* NCSA: SB */
return FALSE; /* NCSA: SB - we didnt handle event, let us know about it */
} /* NCSA: SB */
/*----------------------------------------------------------------------------------*/
/* SendOneChar -- */
/* This code was moved out of HandleKeyDown also, and made into one chunk of code. */
/* Basically I got tired of looking at this code all over HandleKeyDown, */
/* so I put it here -- SMB. Take one char, and write it to the network. If it */
/* needs to be echoed, then send it off to parse... -SMB */
void SendOneChar(unsigned char sendch) /* NCSA: SB */
{ /* NCSA: SB */
if (screens[scrn].echo && screens[scrn].halfdup) /* NCSA: SB - support local echo */
parse( &screens[scrn], &sendch, 1); /* NCSA: SB */
/* NCSA: SB */
netwrite(screens[scrn].port,&sendch,1); /* NCSA: SB */
netpush(screens[scrn].port); /* NCSA: SB */
} /* NCSA: SB */
/* HandleKeyDown --
By now, we have already gotten a keypress signal from the event handler, so we
just need to interpret it. Get the raw code and ascii value, and then decide
what to do with it. */
void HandleKeyDown(EventRecord theEvent)
{
unsigned char ascii, code;
unsigned char sendch;
long menuEquiv;
short enterkey = 0;
Boolean commanddown, optiondown, controldown;
ObscureCursor();
// We don't muck with the KCHR anymore, let the system do that!
ascii = theEvent.message & charCodeMask;
code = ((theEvent.message & keyCodeMask) >> 8);
commanddown = ((theEvent.modifiers & cmdKey) != 0);
optiondown = ((theEvent.modifiers & optionKey) != 0);
controldown = ((theEvent.modifiers & controlKey) != 0);
if (DebugKeys(commanddown, ascii, scrn)) // Handle debug info keys
return;
// Check for EMACS meta key hack first.
/* NCSA: SB - here is where we are going to check if it is an option-escape mapping */
/* NCSA: SB - If so, handle the keypress and return */
if (screens[scrn].emacsmeta && !screens[scrn].ftpstate &&
commanddown && controldown && (ascii >= 1 && ascii < ESC)) /* NCSA: SB */
{ /* NCSA: SB */
if (screens[scrn].lmode) /* NCSA: SB */
{ /* NCSA: SB */
netwrite( screens[scrn].port, screens[scrn].kbbuf /* NCSA: SB */
, screens[scrn].kblen); /* NCSA: SN - flush buffer */
screens[scrn].kblen=0; /* NCSA: SB */
} /* NCSA: SB */
ascii |= 0x60; /* NCSA: SB */
SendOneChar(ESC); /* NCSA: SB - send the ESC char first */
SendOneChar(ascii); /* NCSA: SB - now send the char */
return; /* NCSA: SB - we handled the char, so return */
}
// Handle command keys first (if CommandKeys preference is set to TRUE)
if (commanddown && gApplicationPrefs->CommandKeys) {
menuEquiv = MenuKey(ascii);
if ((menuEquiv & 0xFFFF0000) != 0) {
HandleMenuCommand(menuEquiv,theEvent.modifiers);
return;
}
}
// If the keyboard has no control key and command keys are off, remap the command
// key to control
if (commanddown && !gApplicationPrefs->CommandKeys && !gKeyboardHasControlKey) {
commanddown = 0;
controldown = 1;
}
// Control-Space results in 0 ASCII
if (controldown && (ascii == 32))
ascii=0; /* ASCII nul value for command-spacebar */
/* Remap PgUp,PgDown,Home,End if the user wants it that way */
if (screens[scrn].pgupdwn && !screens[scrn].ftpstate && (code >= KPlowest))
if (CheckPageKeys(code)) return;
/* The rest of HandleKeyDown doesn't make any sense if the window is a corpse.
So we can just return out in that case */
if (screens[scrn].active == CNXN_ISCORPSE) return;
if (commanddown) { /* handle key macros */
if (ascii >='0' && ascii <='9' ) {
sendmacro( ascii-'0');
return;
}
}
// If we are mapping "`" to ESC, do it unless the command key is down.
if (ascii == '`' && gApplicationPrefs->RemapTilde && (!commanddown))
ascii = ESC;
/* If there are no active windows, or if user has hit a command key that doesn't
correspond to a menu or a tilde remap override, ignore the key event */
if (TelInfo->numwindows<1 || ( (commanddown) &&
gApplicationPrefs->CommandKeys &&
ascii != '`' ))
return;
if (!screens[scrn].ftpstate && (code >= KPlowest)) { /* BYU - Handle Keypad */
short shifted;
shifted = ((theEvent.modifiers & shiftKey) != 0);
if (theWorld.keyBoardType == envStandADBKbd) /* BYU 2.4.12 */
if (code == 0x45) code = 0x4e;
else if (code == 0x4e) code = 0x45;
ascii = kpxlate[shifted][code - KPlowest];
// Should we check here for ascii being zero?
VSkbsend(screens[scrn].vs, (unsigned char) ascii, screens[scrn].echo);
return;
}
/* BSD-like mapping.... if we don't want this, set chars to zero and it wont work */
if (ascii == screens[scrn].TELstop) {
screens[scrn].enabled = 0;
return;
}
if (ascii == screens[scrn].TELgo) {
screens[scrn].enabled = 1;
return;
}
if (ascii == screens[scrn].TELip) {
netpush(screens[scrn].port);
netwrite(screens[scrn].port, "\377\364",2);
screens[ scrn].timing = 1; /* set emulate to TMwait */
netwrite(screens[scrn].port, "\377\375\006",3); /* send TM */
if (screens[scrn].lmode)
screens[scrn].kblen=0;
return;
}
// Handle whatever mapping is needed.
mac_nat(&ascii, screens[scrn].national); /* LU/PM: Convert char to US */
// If bsdel is set and the "delete" key was hit, make the ascii a Delete character
if ((screens[scrn].bsdel) && (code == BScode)) ascii = DELchar;
// If the option key or command key is down, flip BS and DEL
if (theEvent.modifiers & (optionKey | cmdKey) && (code == BScode))
if (screens[scrn].bsdel) ascii = BS;
else ascii = DEL;
// If we have a Mac Plus keyboard and not using command keys, command = control key
if (commanddown && !gApplicationPrefs->CommandKeys && !gKeyboardHasControlKey)
ascii &= 0x1f;
if (screens[scrn].ftpstate) /* BYU - ftpclient */
{ /* BYU */
if (ascii>31 && ascii != 127 && ascii < 255 && code<KPlowest) /* BYU - add these chars to buffer */
{ /* BYU */
if (screens[scrn].kblen < (MAXKB -1)) /* BYU - Add to buffer if not full */
{ /* BYU */
screens[scrn].kbbuf[ screens[scrn].kblen++ ] = ascii; /* BYU */
sendch=ascii; /* BYU */
parse( &screens[ scrn], &sendch, 1); /* BYU */
} /* BYU */
else /* BYU */
SysBeep(4); /* BYU - buffer full */
} /* BYU */
else /* BYU - not printable char */
{ /* BYU */
if ( code == BScode ) /* BYU */
{ /* BYU */
if (screens[scrn].kblen>0) /* BYU */
{ /* BYU */
screens[scrn].kblen--; /* BYU */
parse( &screens[scrn],(unsigned char *) "\010 \010",3); /* BYU */
} /* BYU */
} /* BYU */
else if (ascii == CR) /* BYU */
{ /* BYU */
parse( &screens[scrn],(unsigned char *) "\015\012",2); /* BYU */
screens[scrn].kbbuf[ screens[scrn].kblen++ ] = 0; /* BYU */
ftppi(screens[scrn].kbbuf); /* BYU - ftp client */
screens[scrn].kblen=0; /* BYU */
} /* BYU */
else if (ascii == KILLCHAR) /* BYU */
{ /* BYU */
while (screens[scrn].kblen >0) /* BYU */
{ /* BYU */
parse( &screens[scrn],(unsigned char *) "\010 \010",3); /* BYU */
screens[scrn].kblen--; /* BYU */
} /* BYU */
}
}
return; /* BYU */
}
else if (screens[scrn].lmode) /* Some form of linemode is active */
{
if (screens[scrn].lmode & 2) { // TRAPSIG mode active
char vtemp[5];
switch (ascii) {
case 26:
netwrite( screens[scrn].port, screens[scrn].kbbuf, screens[scrn].kblen); /* if full send buffer */
screens[scrn].kblen=0;
sprintf(vtemp,"%c%c",255,237); // IAC SUSP
netwrite(screens[scrn].port,vtemp,2);
break;
case 3:
netwrite( screens[scrn].port, screens[scrn].kbbuf, screens[scrn].kblen); /* if full send buffer */
screens[scrn].kblen=0;
sprintf(vtemp,"%c%c",255,244); // IAC ABORT
netwrite(screens[scrn].port,vtemp,2);
break;
}
}
if (screens[scrn].echo && ! screens[scrn].halfdup) /* Handle local ECHOs */
if (ascii>31 && ascii <127 && code<KPlowest) /* add these chars to buffer */
{
if (screens[scrn].kblen < (MAXKB -1)) /* Add to buffer if not full */
screens[scrn].kbbuf[ screens[scrn].kblen++ ] = ascii;
else
{
netwrite( screens[scrn].port, screens[scrn].kbbuf, screens[scrn].kblen); /* if full send buffer */
screens[scrn].kbbuf[0]=ascii;
screens[scrn].kblen=1;
}
sendch=ascii;
parse( &screens[ scrn], &sendch, 1);
if (!screens[scrn].halfdup)
return; /* OK, were set...*/
}
else /* not printable char */
{
if ( code == BScode )
{
if (screens[scrn].kblen>0)
{
screens[scrn].kblen--;
parse( &screens[scrn],(unsigned char *) "\010 \010",3); /* BYU LSC */
}
return;
}
else if (ascii == CR)
{
char tt[50];
netwrite( screens[scrn].port, screens[scrn].kbbuf, screens[scrn].kblen);
sprintf(tt,"LINEMODE: length %i ",(int)screens[scrn].kblen);
putln(tt);
screens[scrn].kblen=0;
}
else if (ascii == KILLCHAR)
{
while (screens[scrn].kblen >0)
{
parse( &screens[scrn],(unsigned char *) "\010 \010",3); /* BYU LSC */
screens[scrn].kblen--;
}
return;
}
else if (code <KPlowest)
{
netwrite( screens[scrn].port, screens[scrn].kbbuf, screens[scrn].kblen); /* if full send buffer */
screens[scrn].kblen=0;
if (ascii != CR) {
sendch='@'+ascii;
parse( &screens[scrn],(unsigned char *) "^",1);
parse( &screens[scrn], &sendch, 1);
}
}
}
}
else /* BYU = was: if (!screens[scrn].lmflag ) */
{
if (screens[scrn].echo && ! screens[scrn].halfdup) /* Handle local ECHOs */
if (ascii>31 && ascii <127 && code<KPlowest)
{
if (screens[scrn].kblen < (MAXKB -1)) /* Add to buffer if not full */
screens[scrn].kbbuf[ screens[scrn].kblen++ ] = ascii;
else
{
netwrite( screens[scrn].port, screens[scrn].kbbuf,
screens[scrn].kblen); /* if full send buffer */
screens[scrn].kbbuf[ 0 ]=ascii;
screens[scrn].kblen=1;
}
sendch=ascii;
parse( &screens[ scrn], &sendch, 1);
if (!screens[scrn].halfdup)
return; /* OK, were set...*/
}
else
{
if ( code == BScode )
{
if (screens[scrn].kblen>0)
{
screens[scrn].kblen--;
parse( &screens[scrn],(unsigned char *) "\010 \010",3); /* BYU LSC */
}
return;
}
else if (ascii == KILLCHAR)
{
while (screens[scrn].kblen >0)
{
parse( &screens[scrn],(unsigned char *) "\010 \010",3); /* BYU LSC */
screens[scrn].kblen--;
}
return;
}
else if (code <KPlowest)
{
netwrite( screens[scrn].port, screens[scrn].kbbuf,
screens[scrn].kblen); /* if full send buffer */
screens[scrn].kblen=0;
if (ascii !=CR)
{
sendch='@'+ascii;
parse( &screens[scrn],(unsigned char *) "^",1); /* BYU LSC */
parse( &screens[scrn], &sendch, 1);
}
}
}
}
if (ascii == '\015') /* BYU 2.4.18 - changed \n to \015 */
{ /* Map CR->CRLF */
netpush( screens[scrn].port);
// If crmap is on, send CR-NULL instead of CR-LF. If linemode is on, ignore crmap option.
if (!screens[scrn].lmode && screens[scrn].crmap) {
netwrite(screens[scrn].port,"\015",1);
ascii = 0;
}
else if (screens[scrn].lmode)
{
ascii = '\012';
}
else
{
netwrite(screens[scrn].port,"\015",1);
ascii = '\012';
}
if (screens[scrn].echo) parse( &screens[scrn],(unsigned char *) "\012\015",2); /* BYU LSC */
}
// Don't use SendOneChar here because we have to double ASCII 255 to escape its effect
// as the IAC character.
if (screens[scrn].echo && screens[scrn].halfdup)
{
sendch=ascii;
parse( &screens[scrn], &sendch, 1);
}
if (ascii != 255) {
sendch= ascii;
netwrite(screens[scrn].port,&sendch,1);
}
else
netwrite(screens[scrn].port, "\377\377", 2);
netpush(screens[scrn].port);
}
void HandleMouseDown(EventRecord myEvent)
{
GrafPtr whichWindow;
short code, myRGMnum;
code = FindWindow(myEvent.where, &whichWindow);
switch (code) {
case inMenuBar:
HandleMenuCommand(MenuSelect(myEvent.where),myEvent.modifiers); /* BYU LSC */
break;
case inSysWindow:
SystemClick(&myEvent, whichWindow);
break;
case inGoAway:
if (TrackGoAway( whichWindow, myEvent.where))
CloseAWindow((WindowPtr)whichWindow);
break;
case inDrag:
if ((whichWindow != FrontWindow()) &&
(!(myEvent.modifiers & cmdKey)) &&
(!(myEvent.modifiers & optionKey))) {
SelectWindow(whichWindow);
}
DragWindow(whichWindow, myEvent.where, &TelInfo->dragRect);
break;
case inZoomIn:
case inZoomOut:
if (TrackBox( whichWindow, myEvent.where, code))
RSzoom( whichWindow, code, myEvent.modifiers & shiftKey);
break;
/* NCSA: SB - Telnet now allows you to grow the TEK window, finally. */
/* NCSA: SB - So check to see if the click was in a TEK window */
case inGrow:
RSsize( whichWindow, (long *) &myEvent.where, myEvent.modifiers);
myRGMnum = RGfindbywind(whichWindow); /* NCSA: SB - is it a TEK window click? */
if (myRGMnum != -1) /* NCSA: SB - Anyone want to play some BOLO? */
{ /* NCSA: SB */
RGMgrowme((short)myRGMnum, whichWindow,(long *) &myEvent.where,myEvent.modifiers); /* NCSA: TG */
} /* NCSA: SB */
break;
case inContent:
if (whichWindow != FrontWindow()) {
SelectWindow(whichWindow);
}
else
if (RSclick(whichWindow, myEvent) <0) {
SetPort(whichWindow);
GlobalToLocal(&myEvent.where);
RGmousedown(whichWindow, &myEvent.where );
}
break;
default:
break;
}
}
void DoEvents( void)
{
Boolean gotOne; /* Did we get an event */
short vs, i;
EventRecord myEvent;
gotOne = WaitNextEvent(everyEvent, &myEvent, gApplicationPrefs->TimeSlice, 0L);
if (gotOne) {
/* BYU 2.4.11 - Turn the cursor off when the human makes the slightest move. */
if (gApplicationPrefs->BlinkCursor) { /* BYU 2.4.11 */
if ( (vs=RSfindvwind(FrontWindow())) >= 0) /* BYU 2.4.11 */
if (vs == screens[scrn].vs) /* BYU 2.4.11 */
if (!(myEvent.modifiers & cmdKey) && /* BYU 2.4.18 */
((myEvent.what == keyDown) || (myEvent.what == autoKey))
)
RScursblinkon(vs); /* BYU 2.4.18 */
else /* BYU 2.4.18 */
RScursblinkoff(vs); /* BYU 2.4.18 */
} /* BYU 2.4.11 */
switch(myEvent.what) {
case mouseDown:
HandleMouseDown(myEvent);
break;
case updateEvt:
switch(((WindowPeek)myEvent.message)->windowKind) {
case WIN_CONSOLE:
case WIN_LOG:
case WIN_CNXN:
if (RSupdate((GrafPtr) myEvent.message))
putln("Ack, problem in update!");
break;
case WIN_ICRG:
if (MacRGupdate((WindowPtr) myEvent.message))
putln("Ack, problem in update!");
break;
case WIN_TEK:
if (RGupdate((GrafPtr) myEvent.message) ==0)
TekDisable(RGgetVG((GrafPtr) myEvent.message));
else
putln("Ack, problem in update!");
break;
default:
putln("Bad windowkind!");
break;
}
break;
case keyDown:
case autoKey:
HandleKeyDown(myEvent); /* All key events are processed through here */
break;
case diskEvt: /* check to see if disk needs to be initialized */
myEvent.where.h = 100;
myEvent.where.v = 120;
if (noErr != (( myEvent.message >> 16 ) & 0xffff )) { /* check hi word */
DILoad();
DIBadMount( myEvent.where, myEvent.message); /* BYU LSC */
DIUnload();
}
break;
case activateEvt:
if ((myEvent.modifiers & activeFlag)==1) {
AdjustMenus();
DrawMenuBar();
i=WindowPtr2ScreenIndex((GrafPtr) myEvent.message); /* We need to know who */
if (i>=0) {
if ((screens[i].curgraph>-1) && (!(myEvent.modifiers & optionKey)))
detachGraphics(screens[i].curgraph);
changeport(scrn,i);
scrn=i;
}
if ((i=RSfindvwind((GrafPtr) myEvent.message))>=0) {
if (RSTextSelected(i)) { /* BYU 2.4.11 */
EnableItem(myMenus[Fil],FLprint); /* BYU 2.4.11 */
EnableItem(myMenus[Edit],EDcopy); /* BYU 2.4.11 */
EnableItem(myMenus[Edit],EDcopyt); /* BYU 2.4.11 */
} else { /* BYU 2.4.11 */
DisableItem(myMenus[Fil],FLprint); /* BYU 2.4.11 */
DisableItem(myMenus[Edit],EDcopy); /* BYU 2.4.11 */
DisableItem(myMenus[Edit],EDcopyt); /* BYU 2.4.11 */
} /* BYU 2.4.11 */
RSactivate(i);
TelInfo->myfrontwindow=(WindowPeek) myEvent.message;
TelInfo->myfronttype=DEC_WINDOW;
TelInfo->myfrontvs = i;
TelInfo->myfrontRgn =0L;
updateCursor(1);
} else {
TelInfo->myfrontwindow=(WindowPeek) myEvent.message;
TelInfo->myfronttype=TEK_WINDOW;
TelInfo->myfrontRgn =0L;
updateCursor(1);
if ( (i = RGgetdnum((GrafPtr) myEvent.message)) >-1) {
if (( i = RGgetVS( i)) >-1) {
EnableItem(myMenus[Fil],FLprint); /* BYU 2.4.11 - enable printing */
EnableItem(myMenus[Edit],EDcopy); /* BYU 2.4.11 - enable copying */
DisableItem(myMenus[Edit],EDcopyt); /* BYU 2.4.11 */
i = findbyVS( i);
changeport(scrn,i);
scrn=i;
}
}
}
} else {
short i;
// putln("disable event");
AdjustMenus();
DrawMenuBar();
if ((i=RSfindvwind((GrafPtr) myEvent.message))>=0)
RSdeactivate(i);
NoWindow();
}
break;
case app4Evt:
switch(( myEvent.message >>24) &0xff) { /* App4 is a multi-event event */
case switchEvt:
if (myEvent.message & 0x20)
/*Convert clipboard here if necc. (it is not)*/;
if (myEvent.message & 0x1) { /* Resume Event */
GrafPtr window;
TelInfo->suspended = FALSE; /* We are no longer in suspension */
DisableItem( myMenus[Edit],EDcut);
DisableItem( myMenus[Edit],EDundo);
DisableItem( myMenus[Edit],EDclear);
window = FrontWindow(); /* Who's on first */
if ( (vs=RSfindvwind(window)) >= 0) {
RSactivate(vs);
TelInfo->myfrontwindow = (WindowPeek) window;
TelInfo->myfronttype=DEC_WINDOW;
TelInfo->myfrontvs = vs;
TelInfo->myfrontRgn =0L;
updateCursor(1);
} else if ( (long)window != 0L) {
myEvent.message = (long) window;
myEvent.modifiers |= activeFlag;
myEvent.what = activateEvt;
myEvent.when = TickCount();
SystemEvent( &myEvent);
}
}
else { /* Suspend Event */
GrafPtr window;
TelInfo->suspended=TRUE; /* We be in waitin' */
EnableItem( myMenus[Edit],EDcut);
EnableItem( myMenus[Edit],EDundo);
EnableItem( myMenus[Edit],EDclear);
window = FrontWindow(); /* Who's on first */
if ((window = FrontWindow())) {
if ( (vs=RSfindvwind(window)) >= 0)
RSdeactivate(vs);
else if ( (long)window != 0L) {
myEvent.message = (long) window;
myEvent.modifiers &= (~activeFlag);
myEvent.what = activateEvt;
myEvent.when = TickCount();
SystemEvent( &myEvent);
}
}
NoWindow();
}
break; /* switch of myEvent.message >>24 */
}
break;
case kHighLevelEvent:
(void) AEProcessAppleEvent(&myEvent);
break;
}
} else if (gApplicationPrefs->BlinkCursor && !TelInfo->suspended) { /* BYU 2.4.11 */
if ( (vs=RSfindvwind(FrontWindow())) >= 0) /* BYU 2.4.11 */
if (vs == screens[scrn].vs) /* BYU 2.4.11 */
RScursblink(vs); /* BYU 2.4.11 */
} /* BYU 2.4.11 */
updateCursor(0);
}
void CloseAWindow(WindowPtr theWindow)
{
short i;
switch(((WindowPeek)theWindow)->windowKind) {
case WIN_CONSOLE:
// Debugger(); // Can't close the console window
break;
case WIN_LOG:
if (theWindow == ftplog->wind) {
CheckItem(myMenus[Fil],FLlog,FALSE);
TelInfo->ftplogon = FALSE;
RShide(ftplog->vs);
}
break;
case WIN_CNXN:
if ((i = WindowPtr2ScreenIndex(theWindow)) >= 0) {
if ( screens[i].active == CNXN_ISCORPSE)
destroyport(i);
else {
if ( !ReallyClose( i) ) break;
netclose(screens[i].port);
removeport(i);
}
}
break;
case WIN_ICRG:
MacRGdestroy(MacRGfindwind(theWindow));
break;
case WIN_TEK:
destroyGraphics(RGgetVG(theWindow));
break;
default:
DebugStr("\pBad windowkind!");
break;
}
NoWindow();
}